iT邦幫忙

2024 iThome 鐵人賽

DAY 10
1
Python

使用 WiFiBoy Python 玩學機來學物聯網應用 系列 第 10

10. 遊戲製作實例 Simon Says

  • 分享至 

  • xImage
  •  

Simon Says 是什麼遊戲?

Simon Says 是一種簡單但經典的記憶和模仿遊戲,通常適合各個年齡層的玩家。中文地區會叫這遊戲為「老師說」。這個遊戲最初是作為一種口頭遊戲而誕生的,後來被做成電子遊戲設備。

遊戲規則

  1. 基本規則:

    • 一位玩家扮演 "Simon",其他玩家扮演聽從指示的角色。
    • "Simon" 給出一系列指令,開始時通常會說 "Simon says"。
    • 其他玩家只有在聽到 "Simon says" 時才應該執行指令。如果 "Simon" 只給出指令而未說 "Simon says",玩家不應該執行。
  2. 遊戲目標:

    • 玩家需要密切注意並快速做出正確反應。任何在不該動作時動作的玩家會被淘汰。
  3. 遊戲示範:

    • "Simon says, touch your nose"(玩家應該觸碰自己的鼻子)。
    • "Touch your ears"(如果玩家觸碰了耳朵,則被淘汰,因為 "Simon says" 沒有下指令)。

經典的電子版 Simon Says

1978年,Milton Bradley 公司(現已被孩之寶公司收購)推出了一款名為 "Simon" 的電子記憶遊戲。這款遊戲使用光和聲音序列來測試玩家的記憶力。玩家需要記住並重複顏色和聲音的序列,序列會隨著遊戲進行變得越來越長和複雜。

拉爾夫·貝爾(Ralph Baer),電子遊戲之父也是西蒙的發明者。

Simon 有四個不同顏色的按鈕。每個按鈕都播放著獨特的音符。演奏者必須能夠重複西蒙創造的越來越長的音調串。如果你的訂單弄錯了,你就輸了。貝爾意識到,選擇西蒙的四種音調是一個關鍵的決定。他和莫裡森都認為Touch Me的主要缺點之一是它的聲音令人不快。

西蒙電子遊戲,1978

寫一個文字版的 Simon Says

import random
import time
# 設定顏色選項
colors = ['R', 'G', 'B', 'Y']  # 紅, 綠, 藍, 黃

# 函數:顯示提示
def display_sequence(sequence):
    print("請小心輸入按鍵:")
    for color in sequence:
        print(color, end=' ')
        time.sleep(1)
    print("\n" * 50)  # 清除螢幕

# 函數:玩家輸入
def get_player_input(length):
    player_input = []
    print(f"請重複輸入序列 ({length} keys):")
    for i in range(length):
        while True:
            color = input(f"輸入顏色 {i+1} (R, G, B, Y): ").upper()
            if color in colors:
                player_input.append(color)
                break
            else:
                print("輸入錯誤. 請輸入 R, G, B, 或 Y.")
    return player_input

# 主程式
def simon_says():
    print("歡迎來玩 Simon Says 遊戲!")
    sequence = []
    round_num = 1
    while True:
        print(f"\n第 {round_num} 局")
        sequence.append(random.choice(colors))
        display_sequence(sequence)
        player_input = get_player_input(len(sequence))
        
        if player_input == sequence:
            print("正確! 準備進入下一關...")
            round_num += 1
            time.sleep(2)
        else:
            print("錯誤! 遊戲結束!")
            print(f"正確答案是: {' '.join(sequence)}")
            print(f"您得到了 ", 2 ** round_num - 1, "分!")
            break

# 遊戲開始
simon_says()

玩學運算公司提供的 Python IoT 版本 Simon Says

# Simon Game - fun to learn retro-game programming
# Jan 31, 2019, by Peter Gabriel under CC-BY-4.0 license
try:
    if snd: snd.deinit()
except: pass
machine.Pin(17,3).value(1)
snd=machine.PWM(machine.Pin(25, 3)); snd.duty(0)
def soundit(f,t): 
    snd.freq(f); 
    for i in range(20):snd.duty(20-i); time.sleep(t);
    snd.duty(0)
def wait_key():
    while wb.getkey()==0: time.sleep(0.01)
    key=wb.getkey()
    while wb.getkey()>0: time.sleep(0.01)
    if key>=16: key/=16
    return key
qx=[71,71,111,31]; qy=[90,40,65,65]; qt=[415,311,248,208]
qc=[wb.YELLOW, wb.BLUE, wb.RED, wb.GREEN]
def new_game():
    global q, level
    q=[]; level=1
    for i in range(30): q.append(wb.rand(4))
    wb.cls(); wb.colors(0xffff,0); wb.str("Simon Game", 0, 8, 4, 1)
    for i in range(4): wb.box(qx[i]-5,qy[i]-5,30,30,qc[i])
def end_game():
    for i in range(50): soundit(300-i*4,0.001)
    wb.str("Play Again?", 26,100, 5, 1); key=wait_key(); new_game()
def draw_button(i):
    wb.box(qx[q[i]],qy[q[i]],20,20,0)
    soundit(qt[q[i]],0.005)
    wb.box(qx[q[i]],qy[q[i]],20,20,qc[q[i]])   
def get_buttons(level):
    for i in range(level):
        key=wait_key()
        if 2**q[i] == key: draw_button(i)
        else: return False
    time.sleep(0.5)
    return True
new_game()
while True:
    wb.str("Level %02d"%level, 95, 8, 4, 1)
    for i in range(level): draw_button(i); time.sleep(0.1)  
    if get_buttons(level): level+=1
    else: end_game()

遊戲初始畫面:

遊戲結束:

參考資料

  1. Simons Says 起源
  2. 美國國家歷史博物館_Simons Says 資料
  3. Remembering Ralph Baer, the Father of Video Games

上一篇
09. 畫點、畫線與秀圖
下一篇
11. 玩學機開機第一件事會做什麼?
系列文
使用 WiFiBoy Python 玩學機來學物聯網應用 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言